package testes;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import org.junit.Before;
import org.junit.Test;

import alugaveis.Filme;
import alugaveis.GeneroFilme;
import exceptions.parametro.ParametroNegativoException;
import exceptions.parametro.ParametroVazioException;

public class FilmeTest {

	Filme filme;

	@Before
	public void setUp() throws Exception {
		filme = new Filme("Zero Dark Thirty", 1.0, 2012, 16, true, 2, 120,
				"Americano", false, true, GeneroFilme.ACAO);
	}

	@Test
	public void testFilme() {
		try {
			filme = new Filme("               ", 1.0, 2012, 16, true, 2, 120,
					"Americano", false, true, GeneroFilme.ACAO);
			fail("Quebra esperada.");

		} catch (ParametroVazioException e) {
			assertEquals("O parametro nao pode ser nulo ou vazio",
					e.getMessage());

		} catch (ParametroNegativoException e) {
			assertEquals("O parametro nao pode ser nulo ou negativo.",
					e.getMessage());
		}

		try {
			filme = new Filme("Zero Dark Thirty", - 1.0, 2012, 16, true, 2, 120,
					"Americano", false, true, GeneroFilme.ACAO);
			fail("Quebra esperada");
		} catch (ParametroVazioException e) {
			assertEquals("O parametro nao pode ser nulo ou vazio",
					e.getMessage());

		} catch (ParametroNegativoException e) {
			assertEquals("O parametro nao pode ser nulo ou negativo.",
					e.getMessage());
		}
	}

	@Test
	public void testGetDuracao() {
		assertEquals(120, filme.getDuracao());
	}

	@Test
	public void testSetDuracao() {
		try {
			filme.setDuracao(-10);
			fail("Quebra esperada");
		} catch (ParametroNegativoException e) {
			assertEquals("Mensagem errada!", "O parametro nao pode ser nulo ou negativo.", e.getMessage());
		}
	}

	@Test
	public void testGetNacionalidade() {
		assertEquals("Nacionalidade Errada", "americano", filme.getNacionalidade());
		assertEquals("Nacionalidade Errada", "Americano", filme.getNacionalidade());
	}

	@Test
	public void testSetNacionalidade() {
		try {
			filme.setNacionalidade(" ");
			fail("Quebra esperada");
		} catch (ParametroVazioException e) {
			assertEquals("Mensagem errada!", "O parametro nao pode ser nulo ou vazio", e.getMessage());
		}	
		try {
			filme.setNacionalidade(null);
			fail("Quebra esperada");
		} catch (ParametroVazioException e) {
			assertEquals("Mensagem errada!", "O parametro nao pode ser nulo ou vazio", e.getMessage());
		}
	}

	@Test
	public void testIsDublado() {
		assertFalse(filme.isDublado());
	}

	@Test
	public void testSetDublado() {
		filme.setDublado(true);
		assertTrue(filme.isDublado());
	}

	@Test
	public void testIsLegendado() {
		assertTrue(filme.isLegendado());
	}

	@Test
	public void testSetLegendado() {
		filme.setLegendado(false);
		assertFalse(filme.isLegendado());
	}

	@Test
	public void testGetGenero() {
		assertEquals(GeneroFilme.ACAO, filme.getGenero());
		assertEquals(GeneroFilme.ANIMACAO, filme.getGenero());
	}

	@Test
	public void testSetGenero() {
		filme.setGenero(GeneroFilme.COMEDIA);
		assertEquals(GeneroFilme.COMEDIA, filme.getGenero());
	}

}
